package com.yugao.fintech.draper.datascope.strategy.factory;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ArrayUtil;
import com.yugao.fintech.draper.datascope.annotation.DataScope;
import com.yugao.fintech.draper.datascope.handler.DataScopeContextHolder;
import com.yugao.fintech.draper.datascope.strategy.DataScopeStrategy;
import lombok.RequiredArgsConstructor;

import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * 默认的数据权限规则工厂实现类 支持通过DataPermissionContextHolder过滤数据权限 获取生效的数据权限规则
 */
@RequiredArgsConstructor
public class DefaultDataScopeStrategyFactory implements DataScopeStrategyFactory {
    /**
     * 容器中的数据权限规则数组
     */
    private final List<DataScopeStrategy> dataScopeStrategies;

    /**
     * 获取生效的数据权限规则
     *
     * @return 生效的数据权限规则数组
     */
    @Override
    public List<DataScopeStrategy> getDataPermissionRule() {
        // 通过上下文获取数据权限注解
        DataScope dataScope = DataScopeContextHolder.get();
        // 容器中没有数据权限规则的配置
        if (CollectionUtil.isEmpty(dataScopeStrategies)) {
            // 返回空
            return Collections.emptyList();
        }
        // 没有配置数据权限信息 则默认开启 生效所有规则
        if (Objects.isNull(dataScope)) {
            // 返回容器中配置的所有数据权限规则
            return dataScopeStrategies;
        }
        // 已配置数据权限信息 但是禁用 返回空
        if (!dataScope.enable()) {
            // 返回空
            return Collections.emptyList();
        }
        // 已配置数据权限信息 但是仅生效部分规则
        if (ArrayUtil.isNotEmpty(dataScope.includeRules())) {
            // 过滤出生效的数据权限规则
            return dataScopeStrategies.stream()
                    .filter(rule -> ArrayUtil.contains(dataScope.includeRules(), rule.getClass()))
                    .collect(Collectors.toList());
        }

        // 已配置数据权限 但是排除部分规则
        if (ArrayUtil.isNotEmpty(dataScope.excludeRules())) {
            // 过滤出需要排除的数据权限规则
            return dataScopeStrategies.stream()
                    .filter(rule -> !ArrayUtil.contains(dataScope.excludeRules(), rule.getClass()))
                    .collect(Collectors.toList());
        }
        // 已配置数据权限信息 全部规则生效
        return dataScopeStrategies;
    }
}
